﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Domain
{

    /// <summary>
    /// Controller för hantering av aktiviteter
    /// Har koppling till Main och sidvy av Aktivitetskortet
    /// </summary>
    class AktivitetsController
    {
        private SideViews.SideAktivitet aktivitetSide;
        private Views.AktivitetKort aktivitMain;
        private Technical.AktivitetConnection aktivConn;
        private IEnumerable<Aktivietetsregister> aktiviteter;
        private Aktivietetsregister aktivitet;

        //Startmetod för att fylla i alla värden i comboboxar
        public IEnumerable<Aktivietetsregister> ComboboxUpdate()
        {
            aktivConn = new Technical.AktivitetConnection();
            aktiviteter = (IEnumerable<Aktivietetsregister>)aktivConn.getFiltreringskriterier();
            return aktiviteter;
        }
        //Hämtar aktiviteter för att Uppdatera comboxar i sidvy
        public void UpdateComBo()
        {
            aktivConn = new Technical.AktivitetConnection();
            aktivitetSide = (SideViews.SideAktivitet)AccessController.Instance.SidMeny;
            aktivitetSide.updateComboboxes();

        }

        //Returnerar aktivitetslista för att Uppdatera mainVys Datagridview genom databasutsökning (Gjord från sidvy till MainView)
        public IEnumerable<Aktivietetsregister> updateDgv(string Akavd, string Aknamn, string AkID)
        {
            aktivConn = new Technical.AktivitetConnection();
            aktivitMain = (Views.AktivitetKort)AccessController.Instance.MainView;
            return aktivConn.GetAktivitet(Akavd, Aknamn, AkID);
        }

        //validerar att det inte finns en aktivitet med samma namn när man skapar en ny
        public bool ValidateAktivitet(string aktivID, string avd, string aKtivitetsNamn, bool isNew)
        {
            bool IsSuccess = false;
            getActivites();
            if (isNew)
            {
                foreach (Aktivietetsregister aK in aktiviteter)
                {
                    if (aK.aktivitet == aKtivitetsNamn)
                    {
                        return false;
                    }

                }
               IsSuccess = generateAKID(avd, aKtivitetsNamn);
            }
            else
            {
                Aktivietetsregister aktivitet = CreateActivity(avd, aKtivitetsNamn, aktivID);
               IsSuccess = aktivConn.Updateaktivitetregister(aktivitet);
            }
            //updateDgv("", "", aktivID.TrimEnd());
            return IsSuccess;
        }

        //Hämtar alla Aktiviter
        private void getActivites()
        {
            aktivConn = new Technical.AktivitetConnection();
            aktiviteter = aktivConn.getFiltreringskriterier();

        }

        /// <summary>
        /// Genererar ett nytt AktivitetsID baserat på vilken avdelning som valts
        /// och namn, försöker bygga ett genom det först med 4 bokstäver från namn och 
        /// vald avd, om det existerar slumpas bokstäver fram (Inte avd IDna)
        /// </summary>
        /// <param name="avd"></param>
        /// <param name="aKNamn"></param>
        /// <returns></returns>
        private bool generateAKID(string avd, string aKNamn)
        {
            string avdID;
            string aKID;
            if (avd == "Adm")
            {
                avdID = "AO";
            }
            else
            {
                avdID = "FO";
            }
            aKID = aKNamn.Substring(0, 4);
            aKID += avdID;
            //BasicCheck
            aKID = aKID.ToUpper();
            bool BasicCheck = true;
            foreach (Aktivietetsregister aK in aktiviteter)
            {
                if (aK.aktivitetsID.TrimEnd() == aKID)
                {
                    BasicCheck = false;
                }
            }
            if (BasicCheck)
            {
                Aktivietetsregister aktivitet = CreateActivity(avd, aKNamn, aKID);
                aktivConn.Aktivitetsregistrering(aktivitet);
                return true;
            }
            else
            {
                bool isNewID = false;
                int i = 0;
                while (!isNewID && i < 26)
                {
                    isNewID = true;
                    char bokstav = (char)('a' + i);
                    aKID = aKID.Substring(0, 3);
                    aKID = (aKID + bokstav + avdID).ToUpper(); ;
                    foreach (Aktivietetsregister aK in aktiviteter)
                    {
                        if (aK.aktivitetsID.TrimEnd() == aKID)
                        {
                            isNewID = false;
                        }
                    }
                    i++;
                }
                Aktivietetsregister aktivitet = CreateActivity(avd, aKNamn, aKID);
                aktivConn.Aktivitetsregistrering(aktivitet);
                return true;
            }
        }

       //Skapar ett nytt objekt av aktivitet
        private Aktivietetsregister CreateActivity(string avd, string aKNamn, string aktivID)
        {
            aktivitet = new Aktivietetsregister();

            aktivitet.aktivitetsID = aktivID;
            aktivitet.aktivitet = aKNamn;
            aktivitet.avdelningsnamn = avd;
            aktivitet.signatur = AccessController.Instance.LoggedInUser.UserName;
            aktivitet.andratDatum = DateTime.Now;
            
            return aktivitet;
        }

    }
}
